﻿//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;

//namespace Family.Core.Model
//{
//    public class EntityPage<T> : IEnumerable<T> where T : EntityWithTypeId<Int32>
//    {
//        private readonly IEnumerable<T> entities;

//        private readonly int totalEntities;

//        private readonly int pageNumber;

//        private readonly int pageSize;

//        public EntityPage(IEnumerable<T> entities, int totalEntities, int pageNumber, int pageSize)
//        {
//            Check.Require(entities != null, new ArgumentNullException("entities", "Cant create page of entities because entities is null"));
//            Check.Require(totalEntities >= 0, new ArgumentException("Cant create page of entities because total entities count is negative", "totalEntities"));
//            Check.Require(pageNumber > 0, new ArgumentException("Cant create page of entities because page index is zero or negative", "pageNumber"));
//            Check.Require(pageSize >= 0, new ArgumentException("Cant create page of entities because page size is negative", "pageSize"));

//            this.entities = entities;
//            this.totalEntities = totalEntities;
//            this.pageNumber = pageNumber;
//            this.pageSize = pageSize;
//        }

//        public int PageNumber
//        {
//            get { return this.pageNumber; }
//        }

//        public int PageSize
//        {
//            get { return this.pageSize; }
//        }

//        public int TotalItems
//        {
//            get { return this.totalEntities; }
//        }

//        public int TotalPages
//        {
//            get
//            {
//                int wholePages = this.totalEntities / this.pageSize;
//                int restItems = this.totalEntities % this.pageSize;
//                int addPage = restItems == 0 ? 0 : 1;
//                int totalPages = wholePages + addPage;

//                return totalPages;
//            }
//        }

//        public int FirstItem
//        {
//            get
//            {
//                int firstItem;
//                if (this.entities.Count() == 0)
//                {
//                    firstItem = 0;
//                }
//                else
//                {
//                    firstItem = ((this.pageNumber - 1) * this.pageSize) + 1;
//                }

//                return firstItem;
//            }
//        }

//        public int LastItem
//        {
//            get
//            {
//                int lastItem;
//                if (this.entities.Count() == 0)
//                {
//                    lastItem = 0;
//                }
//                else
//                {
//                    if (this.HasNextPage)
//                    {
//                        lastItem = this.pageNumber * this.pageSize;
//                    }
//                    else
//                    {
//                        lastItem = ((this.pageNumber - 1) * this.pageSize) + this.entities.Count();
//                    }
//                }

//                return lastItem;
//            }
//        }

//        public bool HasPreviousPage
//        {
//            get { return this.PageNumber > 1; }
//        }

//        public bool HasNextPage
//        {
//            get { return this.PageNumber < this.TotalPages; }
//        }

//        public IEnumerator<T> GetEnumerator()
//        {
//            return this.entities.GetEnumerator();
//        }

//        IEnumerator IEnumerable.GetEnumerator()
//        {
//            return this.GetEnumerator();
//        }
//    }
//}
